Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Philosophenproblem</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Philosophenproblem"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Philosophenproblem rootpage-Philosophenproblem skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Philosophenproblem</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr">
<p>Beim <b>Philosophenproblem</b> (<span style="font-style:normal;font-weight:normal"><a href="Englische_Sprache" title="Englische Sprache">englisch</a></span> <span lang="en-Latn" style="font-style:italic"><i>dining philosophers problem</i></span>) handelt es sich um ein Fallbeispiel aus dem Bereich der <a href="Theoretische_Informatik" title="Theoretische Informatik">theoretischen Informatik</a>. Damit soll das Problem der <a href="Nebenl%C3%A4ufigkeit" title="Nebenläufigkeit">Nebenläufigkeit</a> und die Gefahr der <a href="Verklemmung" class="mw-redirect" title="Verklemmung">Verklemmung</a> von Prozessen veranschaulicht werden. Das Problem wurde von <a href="Edsger_W._Dijkstra" title="Edsger W. Dijkstra">Edsger W. Dijkstra</a> formuliert.
</p>

<div class="mw-heading mw-heading2"><h2 id="Aufbau">Aufbau</h2></div>
<p>Fünf <a href="Philosoph" title="Philosoph">Philosophen</a>, nummeriert von eins bis fünf, leben in einem Haus, in dem der Tisch für sie gedeckt ist, wobei jeder Philosoph seinen eigenen Platz am Tisch hat. Ihr einziges Problem – neben dem der <a href="Philosophie" title="Philosophie">Philosophie</a> – ist, dass es sich bei dem servierten Gericht um eine sehr schwierige Sorte Spaghetti handelt, die mit zwei Gabeln gegessen werden muss. Zwischen den Tellern befindet sich jeweils eine Gabel, sodass dies für einen einzelnen Philosophen kein Problem darstellt. Allerdings können zwei Nachbarn nicht gleichzeitig essen.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Problem">Problem</h2></div>
<p>Die Philosophen sitzen am Tisch und denken über philosophische Probleme nach. Wenn einer hungrig wird, greift er zuerst die Gabel links von seinem Teller, dann die auf der rechten Seite und beginnt zu essen. Wenn er satt ist, legt er die Gabeln wieder zurück und beginnt wieder zu denken. Sollte eine Gabel nicht an ihrem Platz liegen, wenn der Philosoph sie aufnehmen möchte, so wartet er, bis die Gabel wieder verfügbar ist.
</p><p>Solange nur einzelne Philosophen hungrig sind, funktioniert dieses Verfahren. Es kann aber passieren, dass sich alle fünf Philosophen gleichzeitig entschließen, zu essen. Sie ergreifen also alle gleichzeitig ihre linke Gabel und nehmen damit dem jeweils links von ihnen sitzenden Kollegen dessen rechte Gabel weg. Nun warten alle fünf darauf, dass die rechte Gabel wieder auftaucht. Das passiert aber nicht, da keiner der fünf seine linke Gabel zurücklegt. Die Philosophen verhungern.
</p>
<div class="mw-heading mw-heading2"><h2 id="Lösung_mittels_Ressourcenhierarchie"><span id="L.C3.B6sung_mittels_Ressourcenhierarchie"></span>Lösung mittels Ressourcenhierarchie</h2></div>
<p>Bei der Ressourcenhierarchie-Lösung werden die Gabeln von eins bis fünf durchnummeriert. Jeder Philosoph muss immer zuerst versuchen, die Gabel mit der niedrigeren Nummer aufzunehmen, und nur wenn das erfolgreich war, versucht er, die Gabel mit der höheren Nummer aufzunehmen. In diesem Fall können nicht alle fünf Philosophen gleichzeitig die Gabel mit der niedrigeren Nummer aufnehmen. Entweder nimmt der erste Philosoph die Gabel mit der Nummer eins (die zu seiner linken), oder der letzte Philosoph nimmt diese Gabel (die zu seiner rechten). Nimmt der erste Philosoph diese Gabel, so erhält der vorletzte Philosoph zwei Gabeln und der letzte keine. Nimmt der letzte Philosoph diese Gabel, so erhält der erste Philosoph keine Gabel und der letzte und vorletzte Philosoph streiten sich um die Gabel mit der Nummer fünf, wer zuerst kommt, isst mit zwei Gabeln.
</p><p>Der folgende Quellcode ist eine <a href="C%2B%2B" title="C++">C++</a>11-Implementierung der Ressourcenhierarchie-Lösung für drei Philosophen. Die Funktion sleep_for() simuliert die Zeit, die normalerweise mit Geschäftslogik verbracht wird.
</p>
<div class="mw-highlight mw-highlight-lang-c++ mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;iostream&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;chrono&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;mutex&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;thread&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;random&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;ctime&gt;</span>
<span class="k">using</span><span class="w"> </span><span class="k">namespace</span><span class="w"> </span><span class="nn">std</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">myrand</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">min</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">max</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="n">mt19937</span><span class="w"> </span><span class="n">rnd</span><span class="p">(</span><span class="n">time</span><span class="p">(</span><span class="k">nullptr</span><span class="p">));</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">uniform_int_distribution</span><span class="o">&lt;&gt;</span><span class="p">(</span><span class="n">min</span><span class="p">,</span><span class="n">max</span><span class="p">)(</span><span class="n">rnd</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">phil</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">ph</span><span class="p">,</span><span class="w"> </span><span class="n">mutex</span><span class="o">&amp;</span><span class="w"> </span><span class="n">ml</span><span class="p">,</span><span class="w"> </span><span class="n">mutex</span><span class="o">&amp;</span><span class="w"> </span><span class="n">mh</span><span class="p">,</span><span class="w"> </span><span class="n">mutex</span><span class="o">&amp;</span><span class="w"> </span><span class="n">mo</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(;;)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="c1">// verhindert, dass Thread beendet wird</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">duration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">myrand</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span><span class="w"> </span><span class="mi">800</span><span class="p">);</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Block { } begrenzt Gueltigkeit von lock</span>
<span class="w"> </span><span class="n">lock_guard</span><span class="o">&lt;</span><span class="n">mutex</span><span class="o">&gt;</span><span class="w"> </span><span class="n">moGuard</span><span class="p">(</span><span class="n">mo</span><span class="p">);</span>
<span class="w"> </span><span class="n">cout</span><span class="o">&lt;&lt;</span><span class="n">ph</span><span class="o">&lt;&lt;</span><span class="s">" denkt "</span><span class="o">&lt;&lt;</span><span class="n">duration</span><span class="o">&lt;&lt;</span><span class="s">"ms</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">this_thread</span><span class="o">::</span><span class="n">sleep_for</span><span class="p">(</span><span class="n">chrono</span><span class="o">::</span><span class="n">milliseconds</span><span class="p">(</span><span class="n">duration</span><span class="p">));</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">lock_guard</span><span class="o">&lt;</span><span class="n">mutex</span><span class="o">&gt;</span><span class="w"> </span><span class="n">moGuard</span><span class="p">(</span><span class="n">mo</span><span class="p">);</span>
<span class="w"> </span><span class="n">cout</span><span class="o">&lt;&lt;</span><span class="s">"</span><span class="se">\t\t</span><span class="s">"</span><span class="o">&lt;&lt;</span><span class="n">ph</span><span class="o">&lt;&lt;</span><span class="s">" ist hungrig</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">lock_guard</span><span class="o">&lt;</span><span class="n">mutex</span><span class="o">&gt;</span><span class="w"> </span><span class="n">mlGuard</span><span class="p">(</span><span class="n">ml</span><span class="p">);</span>
<span class="w"> </span><span class="n">this_thread</span><span class="o">::</span><span class="n">sleep_for</span><span class="p">(</span><span class="n">chrono</span><span class="o">::</span><span class="n">milliseconds</span><span class="p">(</span><span class="mi">400</span><span class="p">));</span>
<span class="w"> </span><span class="n">lock_guard</span><span class="o">&lt;</span><span class="n">mutex</span><span class="o">&gt;</span><span class="w"> </span><span class="n">mhGuard</span><span class="p">(</span><span class="n">mh</span><span class="p">);</span>
<span class="w"> </span><span class="n">duration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">myrand</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span><span class="w"> </span><span class="mi">800</span><span class="p">);</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">lock_guard</span><span class="o">&lt;</span><span class="n">mutex</span><span class="o">&gt;</span><span class="w"> </span><span class="n">moGuard</span><span class="p">(</span><span class="n">mo</span><span class="p">);</span>
<span class="w"> </span><span class="n">cout</span><span class="o">&lt;&lt;</span><span class="s">"</span><span class="se">\t\t\t\t</span><span class="s">"</span><span class="o">&lt;&lt;</span><span class="n">ph</span><span class="o">&lt;&lt;</span><span class="s">" isst "</span><span class="o">&lt;&lt;</span><span class="n">duration</span><span class="o">&lt;&lt;</span><span class="s">"ms</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">this_thread</span><span class="o">::</span><span class="n">sleep_for</span><span class="p">(</span><span class="n">chrono</span><span class="o">::</span><span class="n">milliseconds</span><span class="p">(</span><span class="n">duration</span><span class="p">));</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">cout</span><span class="o">&lt;&lt;</span><span class="s">"speisende Philosophen C++11 mit Ressourcenhierarchie</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="w"> </span><span class="n">mutex</span><span class="w"> </span><span class="n">m1</span><span class="p">,</span><span class="w"> </span><span class="n">m2</span><span class="p">,</span><span class="w"> </span><span class="n">m3</span><span class="p">;</span><span class="w"> </span><span class="c1">// 3 Gabeln sind 3 Mutexe</span>
<span class="w"> </span><span class="n">mutex</span><span class="w"> </span><span class="n">mo</span><span class="p">;</span><span class="w"> </span><span class="c1">// für ordentliche Ausgabe</span>
<span class="w"> </span><span class="c1">// 3 Philosophen sind 3 Threads</span>
<span class="w"> </span><span class="kr">thread</span><span class="w"> </span><span class="n">t1</span><span class="p">([</span><span class="o">&amp;</span><span class="p">]</span><span class="w"> </span><span class="p">{</span><span class="n">phil</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">m1</span><span class="p">,</span><span class="w"> </span><span class="n">m2</span><span class="p">,</span><span class="w"> </span><span class="n">mo</span><span class="p">);});</span>
<span class="w"> </span><span class="kr">thread</span><span class="w"> </span><span class="n">t2</span><span class="p">([</span><span class="o">&amp;</span><span class="p">]</span><span class="w"> </span><span class="p">{</span><span class="n">phil</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">m2</span><span class="p">,</span><span class="w"> </span><span class="n">m3</span><span class="p">,</span><span class="w"> </span><span class="n">mo</span><span class="p">);});</span>
<span class="w"> </span><span class="kr">thread</span><span class="w"> </span><span class="n">t3</span><span class="p">([</span><span class="o">&amp;</span><span class="p">]</span><span class="w"> </span><span class="p">{</span><span class="n">phil</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">m1</span><span class="p">,</span><span class="w"> </span><span class="n">m3</span><span class="p">,</span><span class="w"> </span><span class="n">mo</span><span class="p">);});</span><span class="w"> </span><span class="c1">// Ressourcenhierarchie</span>
<span class="w"> </span><span class="n">t1</span><span class="p">.</span><span class="n">join</span><span class="p">();</span><span class="w"> </span><span class="c1">// verhindert, dass Threads beendet werden</span>
<span class="w"> </span><span class="n">t2</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
<span class="w"> </span><span class="n">t3</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Alternative_Lösung"><span id="Alternative_L.C3.B6sung"></span>Alternative Lösung</h2></div>
<p>Bei dieser Variante muss jeder hungrige Philosoph entweder beide Gabeln gleichzeitig, oder keine Gabeln aufnehmen. Es ist nicht gestattet, nur eine aufzunehmen, wenn die zweite nicht verfügbar ist. Allerdings ist es in diesem Fall möglich, dass zum Beispiel immer abwechselnd Philosoph eins und drei und dann Philosoph zwei und vier essen. In diesem Fall verhungert der fünfte Philosoph.
</p>
<div class="mw-heading mw-heading2"><h2 id="Zweck_des_Philosophenproblems">Zweck des Philosophenproblems</h2></div>
<p>Das Szenario der fünf (gelegentlich auch nur drei oder vier) speisenden Philosophen wird oft gebraucht, um das Problem der <a href="Interprozesskommunikation" title="Interprozesskommunikation">Interprozesskommunikation</a> und <a href="Ressource#Informatik" title="Ressource">Ressourcenverwaltung</a> bei der Entwicklung von <a href="Betriebssystem" title="Betriebssystem">Betriebssystemen</a> zu illustrieren.
Das Beispiel soll darstellen, was passieren kann, wenn parallele <a href="Prozess_(Informatik)" title="Prozess (Informatik)">Prozesse</a> auf mehrere gemeinsame <a href="Ressource#Informatik" title="Ressource">Ressourcen</a> angewiesen sind und <a href="Nebenl%C3%A4ufigkeit" title="Nebenläufigkeit">gleichzeitig</a> darauf zugreifen. Dann kann es passieren, dass alle blockiert sind und auf ein Ereignis warten, das durch diese Blockade nie eintreffen wird. Ein solcher Zustand wird als <a href="Deadlock_(Informatik)" title="Deadlock (Informatik)">Deadlock</a> oder Verklemmung bezeichnet.
</p><p>Zur Lösung des Problems werden typischerweise fortschrittliche <a href="Mutex" title="Mutex">Mutexe</a> oder <a href="Semaphor_(Informatik)" title="Semaphor (Informatik)">Semaphore</a> zur <a href="Sequentialisierung" title="Sequentialisierung">Sequentialisierung</a> verwendet, zum Beispiel scoped_lock von C++17.<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="Erzeuger-Verbraucher-Problem" title="Erzeuger-Verbraucher-Problem">Erzeuger-Verbraucher-Problem</a></li>
<li><a href="Raucherproblem" title="Raucherproblem">Raucherproblem</a></li>
<li><a href="Verhungern_(Informatik)" title="Verhungern (Informatik)">Verhungern (Informatik)</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Abraham Silberschatz &amp; James L. Peterson: <i>Operating Systems Concepts.</i> Addison-Wesley 1988, ISBN 0-201-18760-4</li>
<li>K. Mani Chandy &amp; Jayadev Misra: <i>The Drinking Philosophers Problem.</i> In: <i>ACM Transactions on Programming Languages and Systems.</i> Vol. 6, No. 4, Oktober 1984, S. 632–646 (<a rel="nofollow" class="external text" href="https://www.cs.utexas.edu/users/misra/scannedPdf.dir/DrinkingPhil.pdf">PDF; 960&nbsp;kB</a>)</li>
<li><a href="Edsger_W._Dijkstra" title="Edsger W. Dijkstra">Edsger W. Dijkstra</a>: <i>Hierarchical ordering of sequential processes.</i> In: <i>Acta Informatica.</i> 1(2), 1971, S. 115–138 (<a rel="nofollow" class="external text" href="https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD310.PDF">PDF; 1,0&nbsp;MB</a>)</li>
<li>Daniel J. Lehmann &amp; <a href="Michael_O._Rabin" title="Michael O. Rabin">Michael O. Rabin</a>: <i>On the Advantages of Free Choice: A Symmetric and Fully Distributed Solution to the Dining Philosophers Problem.</i> In: <i>Principles Of Programming Languages 1981 (POPL ’81).</i> 1981, S. 133–138</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://www.heise.de/developer/artikel/Dining-Philiosophers-Problem-I-6320973.html">Dining Philiosophers Problem I</a> (deutsch)</li>
<li><a rel="nofollow" class="external text" href="https://www.heise.de/developer/artikel/Dining-Philosopher-Problem-II-6327946.html">Dining Philosopher Problem II</a> (deutsch)</li>
<li><a rel="nofollow" class="external text" href="https://www.heise.de/developer/artikel/Dining-Philosophers-Problem-III-6335228.html">Dining Philosophers Problem III</a> (deutsch)</li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20190103144139/http://laser.cs.umass.edu/verification-examples/dp_standard/dp.html">Discussion of the problem with solution code for 2 or 4 philosophers</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?Dining+Philosophers+Problem">Discussion of various solutions 1</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="https://www.cs.utk.edu/~plank/plank/classes/cs560/560/notes/Dphil/lecture.html">Discussion of various solutions 2</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="https://www.doc.ic.ac.uk/~jnm/concurrency/classes/Diners/Diners.html">Interactive example</a> of the Philosophers problem (englisch) [als <a href="Java-Applet" title="Java-Applet">Java-Applet</a>, gelten inzwischen als veraltet]</li>
<li><a rel="nofollow" class="external text" href="https://www.crockford.com/ec/dining.html">Satan Comes to Dinner</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="https://www.cs.mtu.edu/~shene/NSF-3/e-Book/MUTEX/TM-example-philos-1.html">ThreadMentor</a> (englisch)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">Dijkstra, E. W. (1971, June). <a rel="nofollow" class="external text" href="https://www.cs.utexas.edu/users/EWD/ewd03xx/EWD310.PDF">EWD310 Hierarchical ordering of sequential processes</a>. Acta Informatica 1(2): 115–138</span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><span class="cite"><a rel="nofollow" class="external text" href="https://en.cppreference.com/w/cpp/thread/scoped_lock"><i>std::scoped_lock - cppreference.com.</i></a><span class="Abrufdatum"> Abgerufen am 15.&nbsp;Januar 2022</span>.</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3APhilosophenproblem&amp;rft.title=std%3A%3Ascoped_lock+-+cppreference.com&amp;rft.description=std%3A%3Ascoped_lock+-+cppreference.com&amp;rft.identifier=https%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Fthread%2Fscoped_lock">&nbsp;</span></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-12-04" href="https://de.wikipedia.org/wiki/?title=Philosophenproblem&amp;oldid=262133310">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>